package listNodePractice.reverseListNode.review4_19;

import listNodePractice.ListNode;

public class reverseListNode {

 //  CKG TODO 2023/4/19: 翻转整个单链表
    public ListNode reverse(ListNode head) {
        if (head.next==null) {
            return head;
        }
        //  CKG TODO 2023/4/19: 翻转链表
        ListNode last= reverse(head.next);
        head.next.next=head;
        head.next=null;
   return  last;
    }


    //  CKG TODO 2023/4/19: 翻转前几个单链表
    ListNode successor=null;
    public ListNode reverseN(ListNode head ,int n) {
        if (n==1){
            successor=head.next;
            return head;
        }
        //  CKG TODO 2023/4/19: 翻转链表
        ListNode last= reverseN(head.next,n-1);
        //  CKG TODO 2023/4/19: 这句话可以理解为 是把元素在倒置
        head.next.next=head;
        head.next=successor;
        return  last;
    }


//  CKG TODO 2023/4/19: 翻转部分单链表
    ListNode reverseBetween(ListNode head, int m, int n) {
        // base case
        if (m == 1) {
            return reverseN(head, n);
        }
        // 前进到反转的起点触发 base case
        head.next = reverseBetween(head.next, m - 1, n - 1);

        return head;
    }





    public static void main(String[] args) {
        reverseListNode reverseListNode = new reverseListNode();
        ListNode listNode1 = new ListNode(1);
        ListNode listNode2 = new ListNode(2);
        ListNode listNode3 = new ListNode(3);
        ListNode listNode4 = new ListNode(4);
        ListNode listNode5 = new ListNode(5);
        listNode1.next=listNode2;
        listNode2.next=listNode3;
        listNode3.next=listNode4;
        listNode4.next=listNode5;
//        ListNode reverse = reverseListNode.reverseBetween(listNode1,3,4);
//
//        while (reverse!=null){
//            System.out.println(reverse.val);
//            reverse=reverse.next;
//        }
        reverseListNode.reverse(listNode1);
    }




}
